Flutter 常用布局-多元素布局1

这一篇同样是对基本布局方式的说明。多元素布局相对单元素更复杂一些,而且布局方式也分成几种:Flex类型布局、Stack帧布局、Flow流式布局等。

Flex类型布局

Flex方式是从web中继承过来的,可以很自然地适应屏幕效果。

最常用的控件有两个:Row、Column,分别表示横向方式布局与纵向方式布局。

Flex字段说明

  • mainAxisAlignment 表示主轴方向上对齐方式,这是一个枚举类型,支持start、end、center、spaceBetween、spaceAround、spaceEvenly,默认为start类型。

    start、end、center为主轴位置子控件无间隙,spaceBetween、spaceAround、spaceEvenly 为主轴充满,子控件间使用space填充,不过填充效果不一样。

    另外默认情况下Row的主轴方向是从左至右,Column的主轴方向是从上至下,主轴与交叉轴方向见下图:
  • crossAxisAlignment 表示交叉轴方向上的对齐方式,枚举类型,支持start、end、center、stretch、baseline,默认为center对齐。

    注意,stretch对齐表示子控件在交叉轴方向充满;baseline要求对子控件的baseline对齐,如果无TextBaseline设置,则出错。

  • mainAxisSize 表示主轴上可用长度,枚举值,只支持max与min两种。如果为min,则主轴对齐方式无效。

  • verticalDirection 垂直方向start、end设置,不论主轴还是交叉轴,对齐方式都会跟随改变。默认为down。

  • textBaseline 字符对齐方式,枚举类型alphabetic、ideographic,分别为字符底部baseline、表意字符baseline。

布局规则

  • 遍历子控件,寻找其中没有设置flex的子控件,计算布局,得到主轴方向剩余的可用空间。
  • 遍历子控件,寻找所有设置flex的子控件,得到flex之和。
  • 主轴方向剩余可用空间按照flex值进行均分,然后计算设置flex的子控件布局。
  • 根据mainAxisAlignment、crossAxisAlignment确定每个子控件的位置,绘制完成。

flex类似于LinearLayout中的权重设置。

Flexible与Expanded

Flex布局类型有专门与其对应的子控件FlexibleExpanded,其中存在flex属性用于布局调节。

Expanded是Flexible的子类,两者的区别在于Expanded控件强制按照flex比例,在主轴方向上展开并填充可用空间。而Flexible只会尽可能的按照flex比例分配控件,这种情况下也会兼顾其他约束条件。如下截图所示:



布局展示示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.max,
verticalDirection: VerticalDirection.up,
children: <Widget>[
Container(width: 40,height: 50, color: Colors.green,),
Container(width: 40,height: 30, color: Colors.yellow),
Expanded(
flex: 1,
child: FlatButton(
onPressed: null,
disabledColor: Colors.blue,
child: Text('按钮1'),
),
),
Expanded(
flex: 3,
child: FlatButton(
onPressed: null,
disabledColor: Colors.red,
child: Text('按钮2'),
),
),
Expanded(
flex: 1,
child: FlatButton(
onPressed: null,
disabledColor: Colors.green,
child: Text('按钮3'),
),
),
],
),